package com.wtb.javatool.dao;

import com.wtb.javatool.dto.CourseDto;
import com.wtb.javatool.entity.Course;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;

@Mapper
public interface CourseMapper {

    /**
     * 根据课程的ID查找课程。
     *
     * @param courseId 课程的ID，用于唯一标识课程。
     * @return 查找到的课程对象（只查询项目式驱动的课程），如果未找到则返回null。
     */
    List<Course> findCourseByCourseId(Long courseId);

    /**
     * 根据课程的名称查找课程。
     *
     * @param courseName 课程的名称，用于查找课程。
     * @return 查找到的课程列表（只查询项目式驱动的课程），如果没有找到具有该名称的课程，则返回一个空列表。
     */
    List<Course> findCourseByCourseName(String courseName);

    /**
     * 查询所有课程
     *
     * @return 返回所有课程的列表
     */
    List<Course> findAllCourses();

    /**
     * 查询跟教师用户相关的所有课程
     *
     * @param userId 用户id
     * @param courseName 课程名称
     * @param begin   当前数位置
     * @param size    发现多少条
     * @return 课程信息与关联的项目和教师用户
     */
    List<CourseDto> findCoursesByUserId(@Param("userId") Long userId,
                                        @Param("courseName") String courseName,
                                        @Param("begin") Integer begin,
                                       @Param("size") Integer size);
    /**
     * 查询跟教师用户相关的所有课程的个数
     *
     * @param userId 用户id
     * @param courseName 课程名称
     * @return 所有课程的个数
     */
    Integer findCoursesByUserIdCount(@Param("userId")Long userId, @Param("courseName") String courseName);

    /**
     * 插入新课程
     *
     * @param course 课程对象
     * @return 影响的行数
     */
    int insertCourse(Course course);
    
    /**
     * 添加课程与教师的关联关系
     *
     * @param courseId 课程ID
     * @param userId 用户ID
     * @return 影响的行数
     */
    int insertCourseTeacherRef(@Param("courseId") Long courseId, @Param("userId") Long userId);
    
    /**
     * 添加课程与项目的关联关系
     *
     * @param courseId 课程ID
     * @param projectIds 项目ID列表
     * @return 影响的行数
     */
    int insertCourseProjectRef(@Param("courseId") Long courseId, @Param("projectIds") List<Long> projectIds);
    
    /**
     * 更新课程信息
     *
     * @param course 课程对象
     * @return 影响的行数
     */
    int updateCourse(Course course);
    
    /**
     * 删除课程与项目的关联关系
     *
     * @param courseId 课程ID
     * @return 影响的行数
     */
    int deleteCourseProjectRef(@Param("courseId") Long courseId);
    
    /**
     * 删除课程信息
     *
     * @param courseId 课程ID
     * @return 影响的行数
     */
    int deleteCourse(@Param("courseId") Long courseId);
    
    /**
     * 删除课程与教师的关联关系
     *
     * @param courseId 课程ID
     * @return 影响的行数
     */
    int deleteCourseTeacherRef(@Param("courseId") Long courseId);
    
    /**
     * 检查课程与教师的关联关系是否存在
     * 
     * @param courseId 课程ID
     * @param userId 用户ID
     * @return 关联关系数量
     */
    Integer checkCourseTeacherRefExists(@Param("courseId") Long courseId, @Param("userId") Long userId);
}
